home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue25 / mfboid1s / MFBOID1S.ZIP / uTMovable.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1997-02-17  |  5.3 KB  |  191 lines

  1. unit uTMovable;
  2.  
  3. interface
  4.  
  5. uses
  6.     Graphics, Classes;
  7.  
  8. type
  9.   TMovable = class
  10.       X,Y                                       : real;
  11.     LastMoveX,LastMoveY         : real;
  12.     Speed                                     : Real;
  13.     MaxSpeed                                 : real;
  14.     Dir                                       : Real;
  15.     Color                                     : TColor;
  16.     bSpeedHasChanged                 : boolean;
  17.     LineLength                            : real;
  18.     DistanceSquared                 : Real;
  19.  
  20.     bActive                                 : boolean;
  21.  
  22.     procedure Draw(Canvas : TCanvas);virtual;
  23.     function PrepareToMove(ClosestMovables : TList; ClosestObstacle : TMovable; Canvas : TCanvas) : boolean ; virtual;
  24.  
  25.     procedure Move(Canvas : TCanvas);virtual;
  26.     procedure TurnLeft(delta : real);virtual;
  27.     procedure TurnRight(delta : real);virtual;
  28.     procedure IncreaseSpeed(delta : real);virtual;
  29.     procedure DecreaseSpeed(delta : real);virtual;
  30.     constructor Create(Canvas : TCanvas);
  31.   end;
  32.  
  33.   function Within(Val, Min, Max : real) : boolean;
  34.   procedure Confine(var A : real; Min, Max : real);
  35.   function Max(a,b : real) : real;
  36.   function Min(a,b : real) : real;
  37.   function Deviation(range : real) : real;
  38.   function ConfineDirection(dir : real) : real;
  39.   function MyArcTan(dx,dy : real) : real;
  40.  
  41. implementation
  42.  
  43. //******************************************************************************
  44. procedure Confine(var A : real; Min, Max : real);
  45. begin
  46.   if A < Min then A := Max;
  47.   if A > Max then A := Min;
  48. end;
  49.  
  50. //******************************************************************************
  51. function Max(a,b : real) : real;
  52. begin
  53.   if a > b then
  54.     Max := a
  55.   else
  56.     Max := b;
  57. end;
  58.  
  59. //******************************************************************************
  60. function Min(a,b : real) : real;
  61. begin
  62.   if a < b then
  63.     Min := a
  64.   else
  65.     Min := b;
  66. end;
  67.  
  68. //******************************************************************************
  69. function Deviation(range : real) : real;
  70. begin
  71.   //Deviation := (random(50)-100) * range / 100.0;
  72. end;
  73.  
  74. //******************************************************************************
  75. function ConfineDirection(dir : real) : real;
  76. begin
  77.   if dir < -pi then
  78.     dir := dir + 2*pi;
  79.   if dir > pi then
  80.     dir := dir - 2*pi;
  81.   ConfineDirection := dir;
  82. end;
  83.  
  84. //******************************************************************************
  85. function Within(Val, Min, Max : real) : boolean;
  86. begin
  87.     Within := (Val >= Min) and (Val <= Max);
  88. end;
  89.  
  90. //******************************************************************************
  91. function MyArcTan(dx,dy : real) : real;
  92. var
  93.   RelativeDirection : real;
  94. begin
  95.   if dx = 0 then dx := 0.0001;
  96.  
  97.   RelativeDirection := ArcTan(dy/dx);
  98.  
  99.   if dy >= 0 then
  100.     RelativeDirection := Abs(RelativeDirection)
  101.   else
  102.     RelativeDirection := -Abs(RelativeDirection);
  103.  
  104.     if dx < 0 then
  105.       RelativeDirection := pi - RelativeDirection;
  106.  
  107.     RelativeDirection := ConfineDirection(RelativeDirection);
  108.  
  109.   MyArcTan := RelativeDirection;
  110. end;
  111.  
  112. //******************************************************************************
  113. constructor TMovable.Create(Canvas : TCanvas);
  114. begin
  115.   Speed := random(50) / 100.0 + 0.5;
  116.   Dir :=  random(627) / 100.0 - pi;//}
  117.   if Canvas <> nil then
  118.   begin
  119.       X := Random(Canvas.ClipRect.Right);{100 +random(120);//};
  120.       Y := Random(Canvas.ClipRect.Bottom);{100 +random(120);//};
  121.   end;
  122. end;
  123.  
  124. //******************************************************************************
  125. procedure TMovable.IncreaseSpeed(delta : real);
  126. begin
  127.   // Increase is slower than decrease
  128.   Speed := Speed + delta;
  129.   if Color <> clGreen then
  130.       Color := clBlue;
  131.   bSpeedHasChanged := true;
  132. end;
  133.  
  134. //******************************************************************************
  135. procedure TMovable.DecreaseSpeed(delta : real);
  136. begin
  137.   // Increase is slower than decrease
  138.   Speed := Speed - delta;
  139.   if Color <> clGreen then
  140.       Color := clRed;
  141.   bSpeedHasChanged := true;
  142. end;
  143.  
  144. //******************************************************************************
  145. procedure TMovable.TurnLeft(delta : real);
  146. begin
  147.   Dir := Dir - abs(delta);
  148. end;
  149.  
  150. //******************************************************************************
  151. procedure TMovable.TurnRight(delta : real);
  152. begin
  153.   Dir := Dir + abs(delta);
  154. end;
  155.  
  156. //******************************************************************************
  157. procedure TMovable.Move(Canvas : TCanvas);
  158. begin
  159.     LastMoveX := Speed * cos(Dir) * MaxSpeed;
  160.   LastMoveY := Speed * sin(Dir) * MaxSpeed;
  161.   X := X + LastMoveX;
  162.   Y := Y + LastMoveY;
  163.  
  164.   Confine(X,0,Canvas.ClipRect.Right);
  165.   Confine(Y,0,Canvas.ClipRect.Bottom);
  166. end;
  167.  
  168. //******************************************************************************
  169. procedure TMovable.Draw(Canvas : TCanvas);
  170. var
  171.   dX, dy : real;
  172. begin
  173.   Canvas.Pen.Color := Color;
  174.   Canvas.Brush.Color := Color;
  175.  
  176.   //Canvas.Pixels[trunc(x),trunc(y)] := Color;
  177.   dX := LineLength * cos(Dir) / 2;
  178.   dy := LineLength * sin(Dir) / 2;
  179.   Canvas.MoveTo(trunc(X-dx),trunc(y - dy));
  180.   Canvas.LineTo(trunc(X + dx), trunc(y + dy));//}
  181.  
  182.   {if bSmashed then
  183.       Canvas.Ellipse(trunc(X-3),trunc(y - 3),trunc(X + 3), trunc(y + 3));//}
  184. end;
  185.  
  186. //******************************************************************************
  187. function TMovable.PrepareToMove(ClosestMovables : TList; ClosestObstacle : TMovable; Canvas : TCanvas) : boolean;
  188. begin
  189. end;
  190. end.
  191.